package gu.jimgutil;

/**
 * 色彩空间转换native library实现
 * @author guyadong
 *
 */
class CsCvtNativeImpl {
	private static boolean nativeLoaded = false;
	private static final String LIB_NAME="jimgutil_jni";
	static{
		// load native library
		if(Platform.isAndroid() || Platform.isWindows() || Platform.isLinux()){
			try {
				NativeUtils.loadLibraryFromResource(LIB_NAME,CsCvtNativeImpl.class);
				nativeLoaded = true;
			} catch (Throwable e) {
				System.out.println(e.getMessage());
			}
			
		}else{		
			System.out.println("native library UNSUPPORTED this platform");
		}
	}
	/**
	 * native library是否加载成功
	 * @return
	 */
	static boolean isNativeLoaded() {
		return nativeLoaded;
	}
	/**
	 * 将输入图像的色彩空间RGBA转为BGR，输出到output
	 * @param input 输入图像矩阵RGBA,size=stride*height
	 * @param width 图像宽度
	 * @param height 图像宽度
	 * @param stride 每行步长(字节长度),必须>= width*4
	 * @param output [out] 输出图像,size=width*height*3
	 * @throws NullPointerException 
	 * @throws IllegalArgumentException
	 */
	static native void RGBA2BGR(byte[] input,int width,int height,int stride,byte[] output) 
			throws NullPointerException, IllegalArgumentException;
	/**
	 * 将输入图像的色彩空间RGBA转为RGB，输出到output
	 * @param input 输入图像矩阵RGBA,size=stride*height
	 * @param width 图像宽度
	 * @param height 图像宽度
	 * @param stride 每行步长(字节长度),必须>= width*4
	 * @param output [out] 输出图像,size=width*height*3
	 * @throws NullPointerException 
	 * @throws IllegalArgumentException
	 */
	static native void RGBA2RGB(byte[] input,int width,int height,int stride,byte[] output) 
			throws NullPointerException, IllegalArgumentException;
	/**
	 * 将输入图像的色彩空间RGBA转为灰度，输出到output
	 * @param input 输入图像矩阵RGBA,size=stride*height
	 * @param width 图像宽度
	 * @param height 图像宽度
	 * @param stride 每行步长(字节长度),必须>= width*4
	 * @param output [out] 输出图像,size=width*height
	 * @throws NullPointerException 
	 * @throws IllegalArgumentException
	 */
	static native void RGBA2GRAY(byte[] input,int width,int height,int stride,byte[] output) 
			throws NullPointerException, IllegalArgumentException;
	/**
	 * 将输入图像的色彩空间RGB转为BGR，输出到output
	 * @param input 输入图像矩阵RGBA,size=stride*height
	 * @param width 图像宽度
	 * @param height 图像宽度
	 * @param stride 每行步长(字节长度),必须>= width*3
	 * @param output [out] 输出图像,size=width*height*3
	 * @throws NullPointerException 
	 * @throws IllegalArgumentException
	 */
	static native void RGB2BGR(byte[] input,int width,int height,int stride,byte[] output) 
			throws NullPointerException, IllegalArgumentException;

	/**
	 * 将输入图像的3字节色彩空间(RGB/BGR)反序转换
	 * @param input 输入图像矩阵(RGB/BGR),size=stride*height
	 * @param width 图像宽度
	 * @param height 图像宽度
	 * @param stride 每行步长(字节长度),必须>= width*3
	 * @throws NullPointerException 
	 * @throws IllegalArgumentException
	 */
	static native void swap3byte(byte[] input,int width,int height,int stride) 
			throws NullPointerException, IllegalArgumentException;
	/**
	 * 将输入图像的色彩空间RGB转为灰度，输出到output
	 * @param input 输入图像矩阵RGB,size=stride*height
	 * @param width 图像宽度
	 * @param height 图像宽度
	 * @param stride 每行步长(字节长度),必须>= width*3
	 * @param output [out] 输出图像,size=width*height
	 * @throws NullPointerException 
	 * @throws IllegalArgumentException
	 */
	static native void RGB2GRAY(byte[] input,int width,int height,int stride,byte[] output) 
			throws NullPointerException, IllegalArgumentException;
	
	/**
	 * 将输入图像的色彩空间BGR转为RGBA，输出到output
	 * @param input 输入图像矩阵BGR,size=stride*height
	 * @param width 图像宽度
	 * @param height 图像宽度
	 * @param stride 每行步长(字节长度),必须>= width*3
	 * @param output [out] 输出图像,size=width*height*4
	 * @throws NullPointerException 
	 * @throws IllegalArgumentException
	 */
	static native void BGR2RGBA(byte[] input,int width,int height,int stride,byte[] output) 
			throws NullPointerException, IllegalArgumentException;
	/**
	 * 将输入图像的色彩空间RGB转为RGBA，输出到output
	 * @param input 输入图像矩阵RGB,size=stride*height
	 * @param width 图像宽度
	 * @param height 图像宽度
	 * @param stride 每行步长(字节长度),必须>= width*3
	 * @param output [out] 输出图像,size=width*height*4
	 * @throws NullPointerException 
	 * @throws IllegalArgumentException
	 */
	static native void RGB2RGBA(byte[] input,int width,int height,int stride,byte[] output) 
			throws NullPointerException, IllegalArgumentException;
	
	/**
	 * 将输入图像 顺时针原地旋转(In-place matrix transposition)指定的角度<br>
	 * 图像必须是1字节对齐，多字节对齐的图像旋转可能会造成图像错位
	 * @param input 输入图像矩阵,size=width*height.bpp
	 * @param width 图像宽度
	 * @param height 图像宽度
	 * @param bpp 每像素字节数(1,2,3,4)
	 * @param angle 顺时针旋转角度(0,90,180,270)
	 * @throws NullPointerException
	 * @throws IllegalArgumentException
	 */
	static native void rotate(byte[] input,int width,int height,int bpp,int angle);
	/**
	 * 图像水平翻转<br>
	 * 图像必须是1字节对齐，多字节对齐的图像旋转可能会造成图像错位
	 * @param input 输入图像矩阵,size=width*height*bpp
	 * @param width
	 * @param height
	 * @param bpp 每像素字节数(1,2,3,4)
	 * @throws NullPointerException
	 * @throws IllegalArgumentException
	 */
	static native void hflip(byte[] input,int width,int height,int bpp);
	/**
	 * 图像垂直翻转<br>
	 * 图像必须是1字节对齐，多字节对齐的图像旋转可能会造成图像错位
	 * @param input 输入图像矩阵,size=width*height*bpp
	 * @param width
	 * @param height
	 * @param bpp 每像素字节数(1,2,3,4)
	 * @throws NullPointerException
	 * @throws IllegalArgumentException
	 */
	static native void vflip(byte[] input,int width,int height,int bpp);
}
